package com.yiyw.herostory.factory;

import com.google.protobuf.GeneratedMessageV3;
import com.yiyw.herostory.proto.GameMsgProtocol;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author yiyw
 * @Description 事件类型工厂
 * @Date 2022/8/14 15:23
 **/
@Slf4j
public class GameMsgProtocolFactory {
    /***
     * 通过 MsgCode 获取消息对象
     */
    private static Map<Integer, String> gameMsgProtocolMap = new HashMap<>();
    /***
     * 根据消息对象获取 MsgCode
     */
    private static Map<String, Integer> msgCodeMap = new HashMap<>();

    public static void init() {
        // 获取所有的内部类
        Class<?>[] classes = GameMsgProtocol.class.getDeclaredClasses();
        for (Class<?> aClass : classes) {
            if (!GeneratedMessageV3.class.isAssignableFrom(aClass)) {
                continue;
            }
            String classSimpleName = aClass.getSimpleName().toLowerCase();
            for (GameMsgProtocol.MsgCode msgCode : GameMsgProtocol.MsgCode.values()) {
                String name = msgCode.name();
                name = name.replace("_", "").toLowerCase();
                if (classSimpleName.startsWith(name)) {
                    try {
                        String className = aClass.getName();
                        int msgCodeNumber = msgCode.getNumber();
                        gameMsgProtocolMap.put(msgCodeNumber, className);
                        msgCodeMap.put(className, msgCodeNumber);
                        log.info("{} <===> {}", msgCodeNumber, className);
                    } catch (Exception e) {
                        log.error(e.getMessage(), e);
                    }
                }
            }
        }
    }


    public static GeneratedMessageV3 getGameMsgProtocolByMsgCode(Integer msgCode) {
        String className = gameMsgProtocolMap.get(msgCode);
        try {
            Class<?> aClass = Class.forName(className);
            return  (GeneratedMessageV3) aClass.getDeclaredMethod("getDefaultInstance").invoke(aClass);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return null;
//        switch (msgCode) {
//            case GameMsgProtocol.MsgCode.USER_ENTRY_CMD_VALUE:
//                // 消息类型为 玩家进入事件
//                return (T) GameMsgProtocol.UserEntryCmd.getDefaultInstance();
//            case GameMsgProtocol.MsgCode.WHO_ELSE_IS_HERE_CMD_VALUE:
//                // 消息类型为 还有谁再场
//                return (T) GameMsgProtocol.WhoElseIsHereCmd.getDefaultInstance();
//            case GameMsgProtocol.MsgCode.USER_MOVE_TO_CMD_VALUE:
//                // 消息类型为 玩家移动
//                return (T) GameMsgProtocol.UserMoveToCmd.getDefaultInstance();
//            default:
//                return null;
//        }
    }

    public static int getMsgCodeByGameProtocol(Object msg) {
        return msgCodeMap.get(msg.getClass().getName());
//        int msgCode = -1;
//        // 获取消息类型
//        if (msg instanceof GameMsgProtocol.UserEntryResult) {
//            msgCode = GameMsgProtocol.MsgCode.USER_ENTRY_RESULT_VALUE;
//        } else if(msg instanceof GameMsgProtocol.WhoElseIsHereResult) {
//            msgCode = GameMsgProtocol.MsgCode.WHO_ELSE_IS_HERE_RESULT_VALUE;
//        } else if (msg instanceof GameMsgProtocol.UserQuitResult) {
//            msgCode = GameMsgProtocol.MsgCode.USER_QUIT_RESULT_VALUE;
//        } else if (msg instanceof GameMsgProtocol.UserMoveToResult) {
//            msgCode = GameMsgProtocol.MsgCode.USER_MOVE_TO_RESULT_VALUE;
//        }
//        return msgCode;
    }
}
